package com.chapter17.demo7;


/**
 *  为了避免在共享资源的访问上出现冲突，另外一种解决方式就是取消对资源的共享，每个线程都持有各自的资源副本，这可以采用线程本地存储机制来解决。
 * ThreadLocal<T>类用于提供线程本地变量，这些变量不同于它们的普通副本，因为访问某个变量的每个线程都有它自己的、独立初始化的变量副本。
 * 例如，我们有3个线程，它们都要访问同一个资源x，ThreadLocal会为每个线程都创建一个x的副本，无论何时一个线程访问x，都只能访问到自己的x的副本。
 */
public class Resource {
    //创建了一个私有的静态ThreadLocal对象，用1作为线程本地变量保存的每个线程的初始值。
    private static ThreadLocal<Integer> local=ThreadLocal.withInitial(()->1);

    // 一旦在创建了ThreadLocal对象之后，我们就只能通过get和set方法来访问ThreadLocal对象中的资源。
    // 由于ThreadLocal对象会为每个线程都创建一份资源的副本，所以Resource类的increment方法和get方法不需要声明为同步的，它们不会出现并发访问的问题
    public static void increment(){
        local.set(local.get()+1);
    }
    public static int get(){
        return local.get();
    }
}
